// auto_font_scaler.h

#include <QWidget>
class AutoFontScalerPro {
public:
    // 初始化函数：传入需要自动缩放字体的控件列表
    // 记录每个控件的初始字体大小、宽度和高度，为后续缩放做参考
    void initialize(const QList<QWidget*>& widgets) {
        m_widgetInfos.clear();  // 清空之前的数据
        for (QWidget* w : widgets) {
            if (!w) continue;   // 防止空指针
            int baseFontSize = w->font().pointSize();  // 获取控件初始字体点大小
            int baseWidth = w->width();                 // 获取控件初始宽度
            int baseHeight = w->height();               // 获取控件初始高度
            // 过滤无效的字体大小或控件尺寸
            if (baseFontSize <= 0 || baseWidth <= 0 || baseHeight <= 0) continue;
            // 保存控件对应的初始信息
            m_widgetInfos[w] = { baseFontSize, baseWidth, baseHeight };
        }
    }

    // 缩放字体大小函数
    // 根据控件当前宽高和初始宽高的比例，计算缩放比例
    // 取宽度比例和高度比例的较小值，避免字体超出控件边界
    // 设置新的字体点大小，字体大小最小为1点
    void scaleFonts() {
        for (auto it = m_widgetInfos.begin(); it != m_widgetInfos.end(); ++it) {
            QWidget* w = it.key();  // 当前控件
            if (!w) continue;       // 防止空指针

            const WidgetInfo& info = it.value();  // 获取控件初始信息

            int currentWidth = w->width();     // 当前控件宽度
            int currentHeight = w->height();   // 当前控件高度

            // 计算宽度缩放比例（当前宽度 / 初始宽度）
            double scaleW = (double)currentWidth / info.baseWidth;
            // 计算高度缩放比例（当前高度 / 初始高度）
            double scaleH = (double)currentHeight / info.baseHeight;

            // 取宽高比例中的较小者，防止字体超出控件尺寸
            double scale = qMin(scaleW, scaleH);

            // 计算新的字体点大小，四舍五入
            int newFontSize = std::round(info.baseFontSize * scale);
            if (newFontSize < 1) newFontSize = 1;  // 防止字体大小过小

            // 获取控件当前字体
            QFont f = w->font();
            // 仅在字体大小不同才更新，避免频繁设置
            if (f.pointSize() != newFontSize) {
                f.setPointSize(newFontSize);  // 设置新字体大小
                w->setFont(f);                // 应用字体到控件
            }
        }
    }

private:
    // 内部结构体，保存每个控件的初始字体大小及尺寸
    struct WidgetInfo {
        int baseFontSize;  // 初始字体点数
        int baseWidth;     // 初始控件宽度
        int baseHeight;    // 初始控件高度
    };
    // 使用 QMap 关联控件指针与它们的初始信息
    QMap<QWidget*, WidgetInfo> m_widgetInfos;
};
